<?php

/**
 * Объекты этого класса представляют типы
 */
class Type implements iType {

	private
		$properties       = null,
		$aFieldsNames     = null,
		$aRealFieldsNames = null;
	
	/**
	 * Конструктор
	 * @param array $properties
	 */
	public function __construct (array $properties) {
		$this->properties = $properties;
	}
	
	public static function __set_state(array $values) {
		return new Type($values['properties']);
	}
	
	public function __sleep() {
		return array('properties', 'aFieldsNames', 'aRealFieldsNames');
	}
	
	/**
	 * Получить массив полей
	 * @return array
	 */
	public function getFields () {
		return FieldsController::getInstance()->getTypeFields ($this->getId());
	}
	
	/**
	 * Получить массив с названиями полей
	 * @return array
	 */
	public function getFieldsNames () {
		if ($this->aFieldsNames !== null) {
			return $this->aFieldsNames;
		}
		
		$this->aFieldsNames = array ();
		
		$aFields = $this->getFields ();
			
		foreach ($aFields as $oField) {
			$this->aFieldsNames[] = $oField->getName ();
		}
		
		return $this->aFieldsNames;
	}
	
	/**
	 * Получить массив имен реальных полей
	 * @return array
	 */
	public function getRealFieldsNames () {
		if ($this->aRealFieldsNames !== null) {
			return $this->aRealFieldsNames;
		}
		
		$this->aRealFieldsNames = array ();
		
		$aFields = $this->getFields ();
		
		foreach ($aFields as $oField) {
			if ($oField->isReal ()) {
				$this->aRealFieldsNames[] = $oField->getName ();
			}
		}
		
		return $this->aRealFieldsNames;
	}
	
	/**
	 * Получить объект поля по его имени
	 * @param string $fieldName
	 * @return Field
	 */
	public function getFieldByName ($fieldName) {
		$aFields = $this->getFields ();
		
		if (!isset ($aFields[$fieldName])) {
			return false;
		}
		
		return $aFields[$fieldName];
	}
	
	/**
	 * Получить латинское название типа
	 * @retutn string
	 */
	public function getName () {
		return $this->properties['name'];
	}
	
	/**
	 * Получить название таблицы типа
	 * @return string
	 */
	public function getTableName () {
		return $this->properties['table_name'];
	}
	
	/**
	 * Получить id типа
	 * @return integer
	 */
	public function getId () {
		return $this->properties['id'];
	}
	
	/**
	 * Получить название типа
	 * @return string
	 */
	public function getTitle () {
		return $this->properties['title'];
	}
	
	/**
	 * Получить id родительского типа
	 * @return integer
	 */
	public function getParentId () {
		return $this->properties['parent_id'];
	}
	
}